<?php

namespace app\index\controller;

use app\admin\model\User as ModelUser;
use app\BaseController;
use think\db\Raw;
use think\facade\Db;
use think\facade\Request;
use think\facade\Route;
use think\facade\View;
use app\common\traits\Jump;
use app\index\model\User;
use think\exception\ValidateException;
use think\facade\Cache;
use think\facade\Cookie;
use think\facade\Filesystem;
use think\facade\Session;
use think\Image;
use think\captcha\facade\Captcha;

class Index extends BaseController
{
    use Jump;
    public function index()
    {
        //视图渲染：
        //控制器对应View目录下目录名 大写转小写加下划线
        //方法名对应html文件名      大写转小写加下划线  以.html为后缀结尾
        //当fetch方法没有参数的时候  默认关联对应的html文件  控制器对应view下相同名的目录  方法名对应html文件名
        // 如 helloWord 对应 hello_word.html文件
        //当fetch方法有参数时        对应渲染指定的html页面
        //fetch('应用名/控制器名/方法名')
        //return View::fetch('user');
        //return View::fetch('demo/demo');
        //return View::fetch('admin@index/index');
        //相对路径
        //return View::fetch('../view/index/user');
        //view()  渲染试图的助手函数
        //return View();

        //url生成
        //参数为空时 默认生成当前方法自己的链接
        //参数（'应用/控制器/方法'） 从前到后 可以依次省略
        //echo Route::buildUrl();                     ///index.php/admin/Index/index.html
        //echo Route::buildUrl('user');               ///index.php/index/Index/user.html
        //echo Route::buildUrl('user/user');         ///index.php/index/user/user.html
        //echo Route::buildUrl('admin/user/user');  ///index.php/admin/user/user.html

        //参数('','链接地址栏参数') 从前到后 可以依次省略
        //echo Route::buildUrl('',['id'=>1,'name'=>'tian']); ///index.php/index/Index/index.html?id=1&name=tian

        //suffix 指定生成静态后缀
        //echo Route::buildUrl()->suffix(".php"); ///index.php/index/Index/index.php

        //指定生成二级域名
        //echo Route::buildUrl()->domain('www'); //http://www.tp30.com/index.php/index/Index/index.html

        //     * @param string      $url    路由地址
        //     * @param array       $vars   变量
        //     * @param bool|string $suffix 生成的URL后缀
        //     * @param bool|string $domain 域名
        //echo url(); ///index.php/index/Index/index.html
        //echo url('admin/index/index',['id'=>2],'.php','demo');
        //http://demo.tp30.com/index.php/admin/index/index.php?id=2

        //在html模板中写法
        //{:url('admin/Index/info')}

        //模板赋值
        //赋值标量数据  (标量：字符串、整型、浮点、布尔值)
        //$name='乔泓';
        //View::assign('name',$name);
        //[一维数组]
        //$arr=[
        //    '刘备',
        //    '男',
        //];
        //View::assign('arr',$arr);
        //[多维数组]
        //$arr2=[
        //    [
        //      'name'=>'刘备',
        //      'sex'=>'男'
        //    ],
        //    [
        //        'name'=>'关羽',
        //        'sex'=>'男'
        //    ]
        //];
        //View::assign('arr2',$arr2);
        //[对象]
        //$obj=new \stdClass();
        //$obj->name='张飞';
        //View::assign('obj',$obj);
        //[批量赋值]
        //$arr3=[
        //    'name'=>'孙尚香',
        //    'sex'=>'女'
        //];
        //View::assign($arr3);

        //内置循环
        //循环标签
        // foreach标签 name='循环数据来源' key='数组索引' item='循环变量'
        // volist标签 name='循环数据来源' id='循环变量' $key='数组索引'
        //      key='数组循环计数器' offset='起始位置' length='数据长度'
        //      mod='范围循环' empty='默认值'
        //$arr=[
        //    [
        //        'id'=>1,
        //        'name'=>'刘备'
        //    ],
        //    [
        //        'id'=>2,
        //        'name'=>'关羽'
        //    ],
        //    [
        //        'id'=>3,
        //        'name'=>'张飞'
        //    ],
        //    [
        //        'id'=>4,
        //        'name'=>'赵云'
        //    ],
        //];
        //View::assign('list',$arr);

        //比较标签
        //$name=1;
        //View::assign('name',$name);

        //$a=time();
        //View::assign('a',$a);

        //请求类 param 接get post pathinfo 参数
        // ?id=1 /id/1(pathinfo)
        //$param = Request::param();
        //get 没有参数默认接数组
        //     指定接参变量名 接单独变量的值
        //$get = Request::get('id');
        //post 接参
        //$post = Request::post();
        //文件接参
        //$file = Request::file();

        //【请求信息】
        //$controlle =Request::controller();
        //$action = Request::action();
        //$app = app('http')->getName();
        //echo $app.'/'.$controlle.'/'.$action;

        //请求接参参数
        //Request::get('变量名/变量修饰符','默认值','过滤方法');
        //修饰符	作用
        //s	强制转换为字符串类型
        //d	强制转换为整型类型
        //b	强制转换为布尔类型
        //a	强制转换为数组类型
        //f	强制转换为浮点类型
        //【php常用过滤函数】
        //  stripslashes()主要功能是删除反斜杠
        //  htmlentities() 把字符转换为 HTML 实体
        //  htmlspecialchars() 函数把预定义的字符 "<" （小于）和 ">" （大于）转换为 HTML 实体:
        //  strip_tags()函数剥去字符串中的 HTML 标签：
        //$id=Request::get('id/s','123','stripslashes,htmlentities,htmlspecialchars,strip_tags');
        //var_dump($id);

        //has判断变量是否设置
        //Request::has('id','post');

        //助手函数 input
        //input('?get.id');//判断get 请求的id变量是否设置
        //input(); //相当于Request::param();
        //input('请求方式.变量名/变量修饰符','默认值','过滤函数');

        //$res = Db::name('user')->where('id','in','1,2,4')->select();
        //$res = Db::name('user')->where('id','between','1,4')->select();
        //$res = Db::name('user')->where('openid','notnull')->select();
        //$res = Db::name('user')->where('addtime','BETWEEN TIME','1998-9-9,2021-1-1')->select();
        //Db::name('user')
        //    ->alias([
        //        'user'=>'u',
        //        'order'=>'o'
        //    ])
        //    ->select();

        //$res=Db::name('user')->group('addtime')->select();
        //    //->withoutField('id')
        //    //->select();
        //
        //
        //echo "<pre>";
        //print_r($res);
        //echo "</pre>";

        //这是一个测试修改

        //find in set where()用法
        //$list=Db::name('user')->where('head_img','find in set','j')->select()->toArray();

        //时间查询
        //$list=Db::name('user')->whereTime('addtime','<=','2021-09-19')->select()->toArray();
        //$list=Db::name('user')->whereBetweenTime('addtime','2010-1-1','2021-09-19')->select()->toArray();


        // $list=Db::name('user')->whereYear('addtime','-2 year')->select();
        // $list = Db::name('goods')->whereBetweenTimeField('addtime','updatetime')->select();
        //$list = Db::name('user')->whereUname('唐僧')->select()->toArray();

        //$list = Db::name('user')->getByUname('悟空');
        // $list = Db::name('user')->getFieldByUname('唐僧','id');
        // echo '<pre>';
        // echo print_r($list);
        // echo '<pre/>';

        //echo $srg = Db::name('user')->fetchSql()->select();
        //echo $ssr = Db::name('user')->buildSql();

        //Db::table($srg,'u')->where('id','<',5)->select();



        //echo "<h1>欢迎访问我的代码学习网址</h1>";
        $list = Db::name('order_product')->paginate(5);
        // $save = [
        //     'uname' => '分身',
        //     'sex' => 0
        // ];
        // $save = [
        //     'uname' => '分身1',
        // ];
        // $add = new \app\index\model\User();
        // $srg = $add->saveAll($save);
        // var_dump($srg);
        // $get = Request::get();
        // if (isset($get['id']) && $get['id'] <> "") {
        //     try {
        //         $res = \app\admin\model\User::create($save);
        //     } catch (\Exception $e) {
        //         $res = false;
        //     }
        //     if ($res) {
        //         $this->success('添加成功');
        //         return redirect("https://www.baidu.com");
        //     } else {
        //         $this->error('网络波动，添加失败');
        //     }
        // } else {
        //     $this->error('请认真填写信息');
        // }





        // $add = new \app\index\model\User();
        // $srg = $add->allowField(['uname'])->save($save);
        // echo $add->id;
        // try {
        //     $add = Db::name('user')->save($save);
        // } catch (\Exception $e) {
        //     echo $e->getMessage();
        // }
        //$add = Db::name('user')->save($save);
        //$add = Db::name('user')->insert($save);
        // $add = Db::name('user')->insertGetId($save);

        //[更新]
        // $date = [
        //     'id' => 1,
        //     'uname' => '苦行僧',
        // ];
        // Db::name('user')->save($date);
        // Db::name('user')->update($date);

        // $date1 = [
        //     'uname' => '苦行僧',
        // ];
        // Db::name('user')->where('id',2)->save($date1);
        // Db::name('user')->where('id',2)->update($date1);

        //使用表达式进行更新
        // Db::name("user")
        //     ->where('id', 1)
        //     ->exp('uname', 'UPPER(uname)')
        //     ->update();

        // Db::name("user")->where('id', 1)->update([
        //     'uname' => Db::raw('UPPER(uname)'),
        //     'addtime' => Db::raw('addtime+1000'),
        // ]);
        // Db::name('user')
        //     ->where('id', 1)
        //     ->inc('addtime', 5)
        //     ->update();
        // Db::name('user')
        //     ->where('id', 1)
        //     ->dec('addtime', 1)
        //     ->update();

        // $user = \app\index\model\User::find(1);
        // $user->uname = '修改';
        // $user->save();

        // $user = new User();
        // $user->head_img = 'qq';
        // $user->save();
        // echo $user->head_img;

        $date = [
            'uname' => "abc",
            'sex' => '男'
        ];
        \app\index\model\User::create($date);

        return view('index', ['list' => $list]);
    }

    public function user()
    {
        return View::fetch();
    }
    public function textUpload()
    {
        if (input('file.')) {
            $file     = request()->file('image');

            //$savename = \think\facade\Filesystem::disk('public')->putFile('topic', $file, 'md5');
            // function make_password($length)
            // {
            //     // 密码字符集，可任意添加你需要的字符
            //     $str = array(
            //         'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
            //         'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
            //         't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
            //         'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
            //         'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            //         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
            //     );
            //     // 在 $str 中随机取 $length 个数组元素键名
            //     $keys = array_rand($str, $length);
            //     $password = '';
            //     for ($i = 0; $i < $length; $i++) {
            //         // 将 $length 个数组元素连接成字符串
            //         $password .= $str[$keys[$i]];
            //     }
            //     return $password;
            // }
            // $time = date('Y/m/d', time()) . "/" . make_password(2);
            // function microtime_float()
            // {
            //     list($usec, $sec) = explode(" ", microtime());
            //     return ((float)$usec + (float)$sec);
            // }
            // $time_start = md5(microtime_float()) . ".jpg";
            // $dir = Filesystem::putFileAs($time, $file, $time_start);

            $path = date('Y/m/d', time());
            $num = rand(0, 29);
            $rand = substr(md5(time()), $num, 2);
            $name = md5(microtime(true)) . '.' . $file->extension();
            $dir = Filesystem::putFileAs($path . '/' . $rand, $file, $name);
        }
        return view();
    }
    public function upload()
    {
        // 获取表单上传文件
        try {
            $files = input('file.image');
        } catch (\Exception $e) {
            return [false, '没上传图'];
        }

        if (!$files) return [false, '没上传图'];
        //判断单图多图
        if (is_array($files)) {
            $path = [];
            foreach ($files as $file) {
                $img = \think\facade\Filesystem::putFile('img', $file);
                $path[] = str_replace('\\', '/', $img);
            }
            $path = implode(',', $path);
        } else {
            try {
                validate(['image' => 'fileSize:1024*1024|fileExt:jpg,png'])
                    ->check(['image' => $files]);
            } catch (ValidateException $e) {
                return $e->getMessage();
            }
            $img = \think\facade\Filesystem::putFile('img', $files);
            $path = str_replace('\\', '/', $img);
        }
        return [true, $path];
        exit;
    }
    public function delUser()
    {
        //[Db]:  删除
        // Db::name('user')->delete(1);
        // Db::name('user')->where('id',2)->delete();
        // Db::name('user')->delete([3,4]);
        // Db::name('user')->delete(true);

        //[model]:  删除
        // $info = User::find(6);
        // $res = $info->delete();
        // $info = User::destroy([7, 8]);

        // 软删除
        // $info = User::destroy([7, 8]);
        // 软删除基础上的 真删除
        // $info = User::destroy([7, 8], true);

        // 软删除之后的查询
        // 开启软删除之后 默认查询被软删以外的数据
        // SQL语句如下 ：SELECT * FROM `ecm_user` WHERE `ecm_user`.`delete_time` IS NULL
        // $arr = User::select();
        // 加入--withTrashed-- 之后是查询所有数据  Trashed的意思为 废弃
        // $arr = User::withTrashed()->select();
        // 加入--onlyTrashed-- 之后是查询被软删的数据
        // $arr = User::onlyTrashed()->select();

        // 恢复数据
        // $user = User::onlyTrashed()->find(7);
        // $user->restore();
        // 他们执行以下SQl语句：
        // SELECT * FROM `ecm_user` WHERE ( `id` = 7 ) AND `ecm_user`.`delete_time` IS NOT NULL LIMIT 1
        // UPDATE `ecm_user` SET `delete_time` = NULL WHERE ( `id` = 7 ) AND `delete_time` IS NOT NULL
    }
    //事务
    public function startTrans()
    {
        // 启动事务
        Db::startTrans();
        try {
            Db::name('user')->find(1);
            Db::name('user')->delete(1);
            // 提交事务
            Db::commit();
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
        }
        try {
            $result = validate(\app\admin\validate\User::class)->batch(true)->check([
                'name'  => 'thinkphp',
                'email' => 'thinkphp@qq.com',
            ]);

            if (true !== $result) {
                // 验证失败 输出错误信息
                dump($result);
            }
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            dump($e->getError());
        }
    }
    // 验证
    public function verify()
    {
        //验证的数据
        $post = [
            'uname' => '网吧',
            'sex' => 0
        ];
        try {
            //验证方法                   //调用验证类
            validate(\app\admin\validate\User::class)
                //批量验证方法
                ->batch()
                //调用验证的场景
                ->scene('edit')
                //验证的数据
                ->check($post);
            //验证异常类
        } catch (ValidateException $e) {
            echo '<pre>';
            echo print_r($e->getError());
            echo '<pre/>';
            //全局异常类
        } catch (\Exception $e) {
            echo $e->getMessage();
        }
    }
    // 图像处理
    public function imgChange()
    {

        $img = Image::open('./static/桌面截图.png');
        // $img->crop(100, 200)->save('./crop_100x200.png');
        // $img->flip(2)->save('./flip.png');
        echo "<img src='http://tp30.com/static/桌面截图.png'  width=" . "700" . " />";
        echo "<hr>";
        $img->text('这是一个文章水印', app()->getRootPath() . '/public/MINGLIUB.TTC', 20, '#ffffff')->save('./text.png');
        echo "<img src='http://tp30.com/text.png' />";
        echo "<hr>";
        echo "<img src='http://tp30.com/flip.png' width=" . "700" . " />";
        echo "<hr>";
        echo "<img src='http://tp30.com/crop_100x200.png' />";
        echo "<hr>";
        // $img->thumb(100, 100, 6)->save('thumb_100x100.png');
        echo "<img src='http://tp30.com/thumb_100x100.png' />";
        echo "<hr>";
        // $img->rotate(-90)->save('./rotate_90.png');
        echo "<img src='http://tp30.com/rotate_90.png' width=" . "700" . "  />";
        // $img->flip(2)->save('./rotate_flip.png');
        echo "<img src='http://tp30.com/rotate_flip.png' width=" . "700" . "  />";
        echo "<hr>";
    }
    // Session
    public function login()
    {
        // set 设置session的信息
        // -Session::set("name", "乔泓");
        // get 获取session的信息
        // -Session::get("name");
        // all 获取全部的session的信息 数组
        // -Session::all();
        // 判断session变量是否设置
        // -Session::has('sex');
        // pull取值并删除
        // -Session::pull('age');
        // delete删除
        // -Session::delete('name');
        // clear清空
        // -Session::clear();
        // flash 闪存数据 仅下一次请求有效
        // -Session::flash('name','名字');
        // Session 数组
        // -Session::set('info',['name'=>'ming','sex'=>18]);
        // -Session::set('info.eet','eet');
        // -Session::get('info');
        // 【助手函数】
        // 判断
        // session('?name');
        // 设置
        // session('name','名字');
        // 获取
        // session('name');
        // 删除
        // session('name',null);
        // 清除
        // session(null);
    }
    // Cookie
    public function cookie()
    {
        // cookie 设置
        // Cookie::set();
        // cookie 获取
        // Cookie::get();
        // cookie 删除
        // Cookie::delete('name');
        // cookie 永久保存
        // Cookie::forever('name','value');
        // 【助手函数】
        // 设置
        // cookie('name','value',3600);
        // 获取
        // cookie('name');
        // 删除
        // cookie('name',null);
    }
    // 缓存 cache
    public function cache()
    {
        // cache 设置
        // Cache::set('name',$value,3600); //缓存在3600秒之后过期
        // 使用DateTime对象设置过期时间
        // Cache::set('name', $value, new DateTime('2019-10-01 12:00:00'));
        // 【缓存自增/减】
        // 自增
        // Cache::set('name', 1);
        // Cache::inc('name');
        // 自减
        // Cache::dec('name');
        // 获取
        // Cache::get('name'); // 如果name值不存在，则默认返回 null。
        // 支持指定默认值，例如：
        // Cache::get('name',''); 
        // 追加缓存数据
        // Cache::set('name', [1,2,3]);
        // Cache::push('name', 4);
        // 删除
        // Cache::delete('name'); 
        // 获取并删除
        // Cache::pull('name'); 
        // 清空
        // Cache::clear(); 
        // 不存在则写入缓存数据后返回
        // Cache::remember('start_time', time());
        // 【缓存标签】
        // 给缓存数据打标签
        // Cache::tag('tag')->set('name1','value1');
        // Cache::tag('tag')->set('name2','value2');
        // 清除tag标签的缓存数据
        // Cache::tag('tag')->clear();
        // 清除多个标签的缓存数据
        // Cache::tag(['tag1','tag2'])->clear();
        //可以追加某个缓存标识到标签
        // Cache::tag('tag')->append('name3');
        // 获取标签的缓存标识列表
        // Cache::getTagItems('tag');
        // 【获取缓存对象】
        // 获取缓存对象句柄
        // $handler = Cache::handler();
        // 【助手函数】
        // 设置缓存数据
        // cache('name', $value, 3600);
        // 获取缓存数据
        // var_dump(cache('name'));
        // 删除缓存数据
        // cache('name', NULL);
        // 返回缓存对象实例
        // $cache = cache();
    }
    // 验证码
    public function code()
    {
        // 1. 下载扩展
        // 2. 开启session
        // 3. 生成方式
        // 底层定义
        // {:captcha_img()}
        // <img src="{:captcha_src()}" alt="" onclick="this.src=this.src+'?'">
        // 自定义 Captcha::create('verify');
        // <img src="{:url('ccc')}" alt="">
        // 4. 验证方式 validate中的captcha规则 和 captcha_check方法
        // 5. 配置文件 captcha.php 长度 宽度 展示形式 （字符串，中文，算术....）
        // 自定义需要引入use think\captcha\facade\Captcha;
        if (Request::isPost()) {
            $code = Request::param('code');

            // try {
            //     validate(['code|验证码' => 'require|captcha'])->check(['code' => $code]);
            // } catch (ValidateException $e) {
            //     return $e->getMessage();
            // }

            if (!captcha_check($code)) {
                echo "验证码错误！";
            }
        }
        return view();
    }
    public function ccc()
    {

        return Captcha::create('verify');
    }
}
